#!/usr/bin/python3
# -*-coding:utf-8 -*

"""  Fichier regroupant les fonctions, classes de gestion des éléments animés de l'écran """

# IMPORTS
from config import DOWN
from config import STEP_PER_FRAME
from graphicalComponents import GC

class BaseFrame(object):

    """
        Classe mère de gestion des frames
    
        Paramètres:
        int index - index de la frame à afficher
        GraphicalTilesetSprite graphicalTilesetSprite - objet de représentation pour l'animation du sprite
        int count - variable permettant la gestion du temps entre deux frames
        
    """

    def __init__(self,fileSpriteName,index = 0):
        """
            Constructeur de la classe
            
            Paramètres nommés:
            str fileSpriteName - nom du fichier du sprite
            
        """
        # Variable indiquant l'index de la frame à afficher
        self.index=index
        # Réccupératino du dictionnaire des frames du sprite
        self.graphicalSprite=GC.getitem(fileSpriteName,'sprite')
        # Variable permettant la gestion du temps entre deux frames
        self.countFrame=0

    def __nextFrameIndex(self):
        """ Méthode permettant de déterminer le prochain index de la frame à afficher  """
        pass

class AnimatedSpriteFrame(BaseFrame):

    """
        Classe gestion des frames des sprites animé
        
        Paramètres:
        int direction - direction du sprite
        surface currentImage - image du frame à afficher
        
    """

    def __init__(self,fileSpriteName):
        """
            Constructeur de la classe
            
            Paramètres nommés:
            str fileSpriteName - nom du fichier du sprite
            surface currentimage - image du sprite à un instant t
            
        """
        # Init de la classe mère
        BaseFrame.__init__(self,fileSpriteName)
        # Position de base du sprite
        self.currentImage=self.graphicalSprite[DOWN][self.index]
        # Direction initial
        self.direction=DOWN

    def __nextFrameIndex(self):
        """ Méthode permettant de déterminer le prochain index de la frame à afficher  """
        # Détection du nombre de pas effectué
        self.countFrame=(self.countFrame+1)
        # Si on en a effectué STEP_PER_FRAME
        if self.countFrame%STEP_PER_FRAME==0:
            # On remet les pas à 0
            self.countFrame=0
            # Détection de l'index à afficher en fonction du nombre d'élément dans la liste des frames
            if (self.index+1)<len(self.graphicalSprite[DOWN]):
                self.index+=1
            else:
                self.index=0

    def nextFrame(self,direction):
        """
            Fonction permettant de récupérer 
            
            Paramètre nommé:
            int direction - prochaine direction du sprite
            
            Retour:
            surface
            
        """
        # Gestion du cas ou l'on ne change pas de direction
        if direction==self.direction:
            # Calcul du prochain index
            self.__nextFrameIndex()
        else:
            # Remise à zéro des variables
            self.countFrame=0
            self.index=0
        # Mise à jour de l'image
        self.currentImage=self.graphicalSprite[direction][self.index]
        # Mise à jour de la direction
        self.direction=direction
        # Retour
        return self.currentImage
